package ar.edu.utn.frba.disenio.model;

import java.math.BigDecimal;
import java.util.List;
import ar.edu.utn.frba.disenio.fechas.Fecha;
import ar.edu.utn.frba.disenio.fechas.Formato;

public abstract class Aerolinea {

	public abstract void comprar(Asiento unAsiento, Usuario unUsuario);
	public abstract void reservar(Asiento unAsiento, Usuario unUsuario);

	protected abstract List<VueloDirecto> obtenerVuelos(Busqueda unaBusqueda);
	protected abstract Formato getFormatoFechaAsiento();
	protected abstract BigDecimal porcentajeAdicional();
	protected abstract Ubicacion parsearUbicacion(String unaUbicacion);
	protected abstract Categoria parsearCategoria(String unaCategoria);
	
	public BigDecimal adicional(BigDecimal precioBase) {
		return precioBase.multiply(this.porcentajeAdicional());
	}
	
	public String parsearFecha(Fecha unaFecha){
		String dia = Integer.toString(unaFecha.getDia());
		String mes = Integer.toString(unaFecha.getMes());
		if (unaFecha.getMes() < 10) {
			mes = "0".concat(mes);
		}
		String anio = Integer.toString(unaFecha.getAnio());
		return dia.concat("/").concat(mes).concat("/").concat(anio);
	}

	public Fecha parsearFechayHoraAerolinea(String strFecha, String strHorario){
		Fecha fecha = new Fecha(this.getFormatoFechaAsiento(),strFecha);
		fecha.setTimeEnString(strHorario);
		return fecha;
	}

	protected List<VueloDirecto> asociarAsientosAVuelos(List<Asiento> asientos, List<VueloDirecto> vuelos) {
		for (Asiento unAsiento : asientos){
			for(VueloDirecto unVuelo : vuelos){
				if(unVuelo.getCodigoVuelo().equals(unAsiento.getCodigoVuelo())){
					unVuelo.agregarAsiento(unAsiento);
				}
			}
		}
		return vuelos;
	}
	
	protected List<VueloDirecto> agregarVueloAListaSiNoExiste(List<VueloDirecto> vuelos, VueloDirecto unVueloNuevo){
		boolean esta = false;
		
		if(vuelos.isEmpty()) vuelos.add(unVueloNuevo); 
		else{
			for (VueloDirecto unVuelo: vuelos){
				if(unVuelo.getCodigoVuelo().equals(unVueloNuevo.getCodigoVuelo())){	esta = true; }
			}			
			if(! esta ){
				vuelos.add(unVueloNuevo);
				return vuelos;
			}
		}
		return vuelos;
	}
	
}
